function luckysheetbinary_search(arr, key) {
  let low = 0,
    high = arr.length - 1;

  while (low <= high) {
    let mid = parseInt((high + low) / 2);

    if (key < arr[mid] && (mid == 0 || key >= arr[mid - 1])) {
      return mid;
    } else if (key >= arr[mid]) {
      low = mid + 1;
    } else if (key < arr[mid]) {
      high = mid - 1;
    } else {
      return -1;
    }
  }
}

function luckysheetorder_search(arr, y) {
  let i = 0,
    row = 0,
    row_pre = 0,
    row_index = -1,
    i_ed = arr.length - 1;

  while (i < arr.length && i_ed >= 0 && i_ed >= i) {
    row = arr[i_ed];

    if (i_ed == 0) {
      row_pre = 0;
    } else {
      row_pre = arr[i_ed - 1];
    }

    if (y >= row_pre && y < row) {
      row_index = i_ed;
      break;
    }

    row = arr[i];

    if (i == 0) {
      row_pre = 0;
    } else {
      row_pre = arr[i - 1];
    }

    if (y >= row_pre && y < row) {
      row_index = i;
      break;
    }

    i++;
    i_ed--;
  }

  return row_index;
}

function luckysheet_searcharray(arr, y) {
  let index = arr.length - 1;

  if (arr.length < 40 || y <= arr[20] || y >= arr[index - 20]) {
    index = luckysheetorder_search(arr, y);
  } else {
    index = luckysheetbinary_search(arr, y);
  }

  return index;
}

export { luckysheet_searcharray };
